// // 购物车数据管理
// export default {
//   // 开启命名空间，防止不同模块之间的命名冲突
//   namespaced: true,
//   state: () => ({
//   })
// }
// 购物车数据管理
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
const cart = {
  namespaced: true,
  state: () => ({
    cartList: []
  }),
  getters: {
    // 基于state的二次计算 state数据变 它就变
    effectiveList (state) {
      return state.cartList.filter(item => item.isEffective)
    },
    // 计算有效的购物车列表数据的总量
    // 思路：把所有的有效列表项中的count值加起来
    effectiveCount (state, getters) {
      return getters.effectiveList.reduce((a, c) => {
        return a + c.count
      }, 0)
    },
    // 计算有效的购物车列表的总钱数
    // 思路：把所有项的单价 * 数量 叠加起来
    effectiveTotal (state, getters) {
      return getters.effectiveList.reduce((a, c) => {
        return a + c.count * c.nowPrice
      }, 0)
    },
    // 是否全选
    //  effectiveList列表中所有项的seleted字段都true
    isAllSelected (state, getters) {
      return getters.effectiveList.every(item => item.selected === true)
    },
    // 已选项的count叠加
    // 思路：把所有选中项的列表的count字段值叠加起来
    selectedCount (state, getters) {
      return getters.effectiveList.filter(item => item.selected).reduce((a, c) => {
        return a + c.count
      }, 0)
    },
    // 已选项的总钱数
    // 思路：把所有项的count * nowPirce叠加起来
    allPrice (state, getters) {
      return getters.effectiveList.filter(item => item.selected).reduce((a, c) => {
        return a + c.count * c.nowPrice
      }, 0)
    }
  },
  mutations: {
    // 添加购物车
    addCart (state, list) {
      state.cartList = list
    },
    // 更新购物车
    update (state, list) {
      state.cartList = list
    },
    // 单选
    singleCheck (state, { skuId, selected }) {
      // 点击单选时 把当前点击项再vuex中对应的数据中的selected按照当前的选中状态进行赋值
      const item = state.cartList.find(item => item.skuId === skuId)
      item.selected = selected
    }
  },
  actions: {
    // 添加功能
    asyncAddCart (ctx, { skuId, count }) {
      // 1.调用接口
      // { skuId, count }
      // 1. 调用接口 把关键参数传递给后端
      // 2. 后端拿到参数以后 会使用我们传递的关键参数 在后端生成一个购物车列表
      // 3. 如果我们需要用到这个购物车列表 需要再次调用一个获取购物车列表的接口去获取购物车数据
      return new Promise((resolve) => {
        insertCart({ skuId, count }).then(res => {
          findCartList().then(res => {
            // 2.调用mutation函数
            ctx.commit('addCart', res.result)
            // 调用本次action函数之后 后续的message会不会等待当前的俩个异步请求完事之后才提示呢？
            resolve()
          })
        })
      })
    },
    // 删除
    asyncDelCart (ctx, ids) {
      return new Promise((resolve) => {
        deleteCart(ids).then(() => {
          // 重新拉取购物车列表
          findCartList().then(res => {
            // 2.调用mutation函数
            ctx.commit('addCart', res.result)
            // 调用本次action函数之后 后续的message会不会等待当前的俩个异步请求完事之后才提示呢？
            resolve()
          })
        })
      })
    },
    // 更新
    updateCartList (ctx) {
      findCartList().then(res => {
        ctx.commit('update', res.result)
      })
    },
    // 单选
    asyncSingleCheck (ctx, good) {
      return new Promise((resolve) => {
        updateCart(good).then(res => {
          findCartList().then(res => {
            ctx.commit('update', res.result)
          })
          resolve()
        })
      })
    },
    // 全选
    asyncAllCheck (ctx, selected) {
      return new Promise((resolve) => {
        const params = {
          selected,
          ids: ctx.getters.effectiveList.map(item => item.skuId)
        }
        checkAllCart(params).then(res => {
          findCartList().then(res => {
            ctx.commit('update', res.result)
          })
          resolve()
        })
      })
    },
    // 数量修改
    asyncCount (ctx, good) {
      return new Promise((resolve) => {
        updateCart(good).then(res => {
          findCartList().then(res => {
            ctx.commit('update', res.result)
          })
          resolve()
        })
      })
    }
  }
}

export default cart
